import org.junit.Test;

import java.io.*;

/**
 * @auther yangdong
 * @create 2020-04-15
 * 转换流提供了在字节流和字符流之间的转换
 * Java API提供了两个转换流：
 *  InputStreamReader：将InputStream转换为Reader
 *  OutputStreamWriter：将Writer转换为OutputStream
 *  字节流中的数据都是字符时，转成字符流操作更高效。
 *  很多时候我们使用转换流来处理文件乱码问题。实现编码和
 * 解码的功能。
 *
 * 属于字符流
 *
 *  编码表的由来
 * 计算机只能识别二进制数据，早期由来是电信号。为了方便应用计算机，让它可以识
 * 别各个国家的文字。就将各个国家的文字用数字来表示，并一一对应，形成一张表。
 * 这就是编码表。
 *  常见的编码表
 *  ASCII：美国标准信息交换码。
 *  用一个字节的7位可以表示。
 *  ISO8859-1：拉丁码表。欧洲码表
 *  用一个字节的8位表示。
 *  GB2312：中国的中文编码表。最多两个字节编码所有字符
 *  GBK：中国的中文编码表升级，融合了更多的中文文字符号。最多两个字节编码
 *  Unicode：国际标准码，融合了目前人类使用的所有字符。为每个字符分配唯一的
 * 字符码。所有的文字都用两个字节来表示。
 *  UTF-8：变长的编码方式，可用1-4个字节来表示一个字符。
 */
public class InputStreamReaderTest {

    @Test
    public void testInputStreamReader(){
        FileInputStream fis=null;
        InputStreamReader isr=null;
        try {
            fis=new FileInputStream("src/hello.txt");
            isr=new InputStreamReader(fis);
            char[] b=new char[100];
            int len;
            while ((len=isr.read(b))!=-1){
                String str=new String(b,0,len);
                System.out.println(str);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                isr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @Test
    public void TestOutputStreamWriter(){
        FileInputStream fis=null;
        InputStreamReader isr=null;
        FileOutputStream fos=null;
        OutputStreamWriter osw=null;
        try {
            fis=new FileInputStream("src/hello.txt");
            isr=new InputStreamReader(fis);
            fos=new FileOutputStream("src/hello4.txt");
            osw=new OutputStreamWriter(fos,"gb2312");
            char[] b=new char[100];
            int len;
            while ((len=isr.read(b))!=-1){
                osw.write(b,0,len);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                isr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                osw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
